package dev.view;

import java.awt.Toolkit;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Vector;

import dev.controller.myControllerImpl;

public class UserroleNetzadministrator implements UserroleInterface{
	private myControllerImpl control;
	BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
	final static String[] skills = {
		"Station anlegen","Station aendern","Station loeschen",
		"Bahnsteig hinzufuegen","Bahnsteig loeschen","Umsteigezeit aendern",
		"Trasse anlegen","Trasse loeschen","fahrzeit aendern",
		"Linie anlegen","Linie aendern","Linie loeschen",
		"Liniennetz exportieren","Testdaten importieren","Abmelden","Verlassen"
	};
	@Override
	public void showMenu(myControllerImpl inControl) {
		control = inControl;		
		boolean ok;
		int menuWahl;
		do{
			print("Menu");
			for(int i=0;i<skills.length;++i){
				if(i<9) print(" "+(i+1)+". "+skills[i]); else print((i+1)+". "+skills[i]);
			}
			menuWahl = 0;
			do{
				ok = true;
				try{
					System.out.print("Auswahl:\t");
					menuWahl = Integer.parseInt(input.readLine());
				}catch(Exception e){
					ok = false;
					print("Falsche Eingabe!");
					Toolkit.getDefaultToolkit().beep();
				}
			}while(!ok);
			selectActivity(menuWahl);
		}while(menuWahl!=16);
	}
	public void selectActivity(int index) {
		switch (index){
			case  1:  station_anlegen();       	break;
			case  2:	station_aendern();       	break;
			case  3:	station_loeschen(); 	   	break;
			case  4:	bahnsteig_hinzufuegen(); 	break;
			case  5:	bahnsteig_loeschen(); 	 	break;
			case  6:	umsteigezeit_aendern();  	break;
			case  7:	trasse_anlegen();					break;
			case  8:	trasse_loeschen();			 	break;
			case  9:	fahrzeit_aendern();			 	break;
			case 10:	linie_anlegen();				 	break;
			case 11:	linie_aendern();         	break;
			case 12:	linie_loeschen();        	break;
			case 13:	liniennetz_exportieren(); break;
			case 14:	testdaten_importieren();  break;
			case 15:	break;
			case 16:	break;
			default:	break;
				
		}
	}
	@Override
	public String getName() {
		return "Netzadministrator";
	}
	private void print(String inString){
		System.out.println(inString); // :)
	}
	private void testdaten_importieren(){
		control.importTestdaten();
	}
	private void station_anlegen(){
		boolean ok;
		String statName;
		int aufenthaltsdauer = 0, bahnsteigAnz = 0;
		do {
			ok = true;
			statName = "";
			print("Eingabe der erwarteten Parameter!");
			try{
				System.out.print("Stationsname:\t\t");
				statName = input.readLine();
				System.out.print("Aufenthaltsdauer:\t");
				aufenthaltsdauer = Integer.parseInt(input.readLine());
				System.out.print("Anzahl der Bansteige:\t");
				bahnsteigAnz = Integer.parseInt(input.readLine());
			}catch(Exception e){
				ok = false;
				print("Falsche Eingabe!");
				Toolkit.getDefaultToolkit().beep();
			}
		}while(!ok);
		control.station_anlegen(statName, aufenthaltsdauer, bahnsteigAnz);
	}
	private void station_aendern(){
		boolean ok;
		String statName;
		int aufenthaltsdauer = 0, statID = 0;
		do {
			ok = true;
			statName = "";
			print("Geben Sie eine Stations-ID ein!");
			try{
				System.out.print("Stations ID:\t\t");
				statID = Integer.parseInt(input.readLine());
				print("Eingabe der aenderungen!");
				System.out.print("Stationsname:\t\t");
				statName = input.readLine();
				System.out.print("Aufenthaltsdauer:\t");
				aufenthaltsdauer = Integer.parseInt(input.readLine());
			}catch(Exception e){
				ok = false;
				print("Falsche Eingabe!");
				Toolkit.getDefaultToolkit().beep();
			}
		}while(!ok);
		control.station_aendern(statID, statName, aufenthaltsdauer);
	}
	private void station_loeschen(){
		boolean ok;
		int statID = 0;
		do {
			ok = true;
			print("Geben Sie eine Stations-ID ein!");
			try{
				System.out.print("Stations ID:\t");
				statID = Integer.parseInt(input.readLine());
			}catch(Exception e){
				ok = false;
				print("Falsche Eingabe!");
				Toolkit.getDefaultToolkit().beep();
			}
		}while(!ok);
		control.station_loeschen(statID);
	}
	private void bahnsteig_hinzufuegen(){
		boolean ok;
		int statID = 0, bSteigAnz = 0;
		do {
			ok = true;
			print("Geben Sie eine Stations-ID ein!");
			try{
				System.out.print("Stations ID:\t");
				statID = Integer.parseInt(input.readLine());
				print("Wie viele bahnsteige sollen hinzugefuegt werden?");
				System.out.print("Anzahl:\t");
				bSteigAnz = Integer.parseInt(input.readLine());
			}catch(Exception e){
				ok = false;
				print("Falsche Eingabe!");
				Toolkit.getDefaultToolkit().beep();
			}
		}while(!ok);
		control.bahnsteig_hinzufuegen(statID,bSteigAnz);
	}
	private void bahnsteig_loeschen(){
		boolean ok;
		int statID = 0, bSteigNr = 0;
		do {
			ok = true;
			print("Eingabe der erwarteten Parameter!");
			try{
				System.out.print("Stations ID:\t");
				statID = Integer.parseInt(input.readLine());
				System.out.print("Bahnsteig-Nummer:\t");
				bSteigNr = Integer.parseInt(input.readLine());
			}catch(Exception e){
				ok = false;
				print("Falsche Eingabe!");
				Toolkit.getDefaultToolkit().beep();
			}
		}while(!ok);
		control.bahnsteig_loeschen(statID,bSteigNr);
	}
	private void umsteigezeit_aendern(){
		boolean ok;
		int statID = 0, bSteigNr_1 = 0, bSteigNr_2 = 0, umsteigezeit = 0;
		do {
			ok = true;
			print("Eingabe der erwarteten Parameter!");
			try{
				System.out.print("Stations ID:\t");
				statID = Integer.parseInt(input.readLine());
				System.out.print("Bahnsteig-Nr(A):\t");
				bSteigNr_1 = Integer.parseInt(input.readLine());
				System.out.print("Bahnsteig-Nr(B):\t");
				bSteigNr_2 = Integer.parseInt(input.readLine());
				System.out.print("Umsteigezeit:\t");
				umsteigezeit = Integer.parseInt(input.readLine());
			}catch(Exception e){
				ok = false;
				print("Falsche Eingabe!");
				Toolkit.getDefaultToolkit().beep();
			}
		}while(!ok);
		control.umsteigezeit_aendern(statID,bSteigNr_1,bSteigNr_2,umsteigezeit);
	}
	private void trasse_anlegen(){
		boolean ok;
//	statID_1, statID_2, bstgR0_1, bstgR0_2, fahrzeitR0, bstgR1_1, bstgR1_2, fagrzeitR1;
		int[] para;
		Vector<int[]> vec = new Vector<int[]>();
		int weiter = 0;
		do{
			do{
				ok = true;
				print("Eingabe der erwarteten Parameter!");
				para = new int[] {0,0,0,0,0,0,0,0};
				try{
					if(vec.isEmpty()){
						System.out.print("Stations ID(1):\t\t");
						para[0] = Integer.parseInt(input.readLine());
						System.out.print("Stations ID(2):\t\t");
						para[1] = Integer.parseInt(input.readLine());
						System.out.print("Bahnsteig R0 (1):\t");
						para[2] = Integer.parseInt(input.readLine());
						System.out.print("Bahnsteig R0 (2):\t");
						para[3] = Integer.parseInt(input.readLine());
						System.out.print("Fahrzeit R0 :\t\t");
						para[4] = Integer.parseInt(input.readLine());
						System.out.print("Bahnsteig R1 (1):\t");
						para[5] = Integer.parseInt(input.readLine());
						System.out.print("Bahnsteig R1 (2):\t");
						para[6] = Integer.parseInt(input.readLine());
						System.out.print("Fahrzeit R1 :\t\t");
						para[7] = Integer.parseInt(input.readLine());
					}else{
						print("Stations ID(1):\t\t" + vec.lastElement()[1]);
						para[0] = vec.lastElement()[1];
						System.out.print("Stations ID(2):\t\t");
						para[1] = Integer.parseInt(input.readLine());
						print("Bahnsteig R0 (1):\t" + vec.lastElement()[3]);
						para[2] = vec.lastElement()[3];
						System.out.print("Bahnsteig R0 (2):\t");
						para[3] = Integer.parseInt(input.readLine());
						System.out.print("Fahrzeit R0 :\t\t");
						para[4] = Integer.parseInt(input.readLine());
						System.out.print("Bahnsteig R1 (1):\t");
						para[5] = Integer.parseInt(input.readLine());
						print("Bahnsteig R1 (2):\t" + vec.lastElement()[5]);
						para[6] = vec.lastElement()[5];
						System.out.print("Fahrzeit R1 :\t\t");
						para[7] = Integer.parseInt(input.readLine());
					}
				}catch(Exception e){
					ok = false;
					print("Falsche Eingabe!");
					Toolkit.getDefaultToolkit().beep();
				}
			}while(!ok);	
			vec.add(para);
			do{
				System.out.print("Trassen weiter ausbauen? ja = 1; nein = 0 : ");
				ok = true;
				try{
					weiter = Integer.parseInt(input.readLine());
				}catch(Exception e){
					ok = false;
					print("Falsche Eingabe!");
					Toolkit.getDefaultToolkit().beep();
				}
				if(weiter == 0 || weiter == 1){ 
					ok = true;
				}else{
					ok = false;
					print("Falsche Eingabe!");
				}
			}while(!ok);
		}while(weiter == 1);
		control.trasse_anlegen(vec);
	}
	private void trasse_loeschen(){
		boolean ok;
		int trasID = 0;
		do {
			ok = true;
			print("Eingabe der erwarteten Parameter!");
			try{
				System.out.print("Trassen ID:\t");
				trasID = Integer.parseInt(input.readLine());
			}catch(Exception e){
				ok = false;
				print("Falsche Eingabe!");
				Toolkit.getDefaultToolkit().beep();
			}
		}while(!ok);
		control.trasse_loeschen(trasID);
	}
	private void fahrzeit_aendern(){
		boolean ok;
		int trasID = 0, trasRichtung = 0, statID_von = 0, bSteigNr_von = 0, statID_nach = 0,bSteigNr_nach = 0, fahrzeit = 0;
		do {
			ok = true;
			print("Eingabe der erwarteten Parameter!");
			try{
				System.out.print("Trassen-ID:\t");
				trasID = Integer.parseInt(input.readLine());
				System.out.print("Trassen-Richtung:\t");
				trasRichtung = Integer.parseInt(input.readLine());
				System.out.print("Stations-ID(von):\t");
				statID_von = Integer.parseInt(input.readLine());
				System.out.print("Bahnsteig-Nr(von):\t");
				bSteigNr_von = Integer.parseInt(input.readLine());
				System.out.print("Stations-ID(nach):\t");
				statID_nach = Integer.parseInt(input.readLine());
				System.out.print("Bahnsteig-Nr(nach):\t");
				bSteigNr_nach = Integer.parseInt(input.readLine());
				System.out.print("Fahrzeit:\t\t");
				fahrzeit = Integer.parseInt(input.readLine());
			}catch(Exception e){
				ok = false;
				print("Falsche Eingabe!");
				Toolkit.getDefaultToolkit().beep();
			}
		}while(!ok);
		control.fahrzeit_aendern(trasID,trasRichtung,statID_von,bSteigNr_von,statID_nach,bSteigNr_nach,fahrzeit);
	}
	private void linie_anlegen(){
		boolean ok;
		String linienFarbe = "";
		int statID_start = 0, statID_end = 0, trasID = 0;
		do {
			ok = true;
			print("Eingabe der erwarteten Parameter!");
			try{
				System.out.print("Linien-Farbe:\t\t");
				linienFarbe = input.readLine();
				System.out.print("Stations-ID(Start):\t");
				statID_start = Integer.parseInt(input.readLine());
				System.out.print("Stations-ID(Ende):\t");
				statID_end = Integer.parseInt(input.readLine());
				System.out.print("Trassen-ID:\t\t");
				trasID = Integer.parseInt(input.readLine());
			}catch(Exception e){
				ok = false;
				print("Falsche Eingabe!");
				Toolkit.getDefaultToolkit().beep();
			}
		}while(!ok);
		control.linie_anlegen(linienFarbe,statID_start,statID_end,trasID);
	}
	private void linie_aendern(){
		boolean ok;
		String linienFarbe = "";
		int statID_start = 0, statID_end = 0;
		do {
			ok = true;
			print("Eingabe der erwarteten Parameter!");
			try{
				System.out.print("Linien-Farbe:\t\t");
				linienFarbe = input.readLine();
				System.out.print("Stations-ID(Start):\t");
				statID_start = Integer.parseInt(input.readLine());
				System.out.print("Stations-ID(Ende):\t");
				statID_end = Integer.parseInt(input.readLine());
			}catch(Exception e){
				ok = false;
				print("Falsche Eingabe!");
				Toolkit.getDefaultToolkit().beep();
			}
		}while(!ok);
		control.linie_aendern(linienFarbe,statID_start,statID_end);
	}
	private void linie_loeschen(){
		boolean ok;
		String linienFarbe = "";
		do {
			ok = true;
			print("Eingabe der erwarteten Parameter!");
			try{
				System.out.print("Linien-Farbe:\t\t");
				linienFarbe = input.readLine();
			}catch(Exception e){
				ok = false;
				print("Falsche Eingabe!");
				Toolkit.getDefaultToolkit().beep();
			}
		}while(!ok);
		control.linie_loeschen(linienFarbe);
	}
	private void liniennetz_exportieren(){
		control.liniennetz_exportieren();
	}
}